#ifndef CUDA_TEXTURE_H
#define CUDA_TEXTURE_H

// #include <QOpenGLTexture>
// #include <QOpenGLFunctions>

#include <glad/glad.h>

#include <algorithm/rayTracing/qmcrt_util/vector_arithmetic.cuh>
#include <algorithm/shared/tool/imageSaver/CudaColorBar.cuh>

#include <cuda_gl_interop.h>
#include <cuda_runtime.h>

namespace solar::cuda
{
    class CudaTexture
    {
        public:
            CudaTexture();

            ~CudaTexture();
            // {
            //     cudaCheckErrors(cudaFree(colors_));
            //     cudaCheckErrors(cudaFree(factors_));
            // }

            // QOpenGLTexture* getTexture(){
            //     printf("CudaTexture::getTexture\n");
            //     return texture_;
            // }

            // 通过raytracingpipeline中的result_data_直接获取fluxmap颜色值
            void generateTextureViaRayTracingPipeline();

            [[nodiscard]] auto getTextureId() const -> uint { return texid_; }
            [[nodiscard]] auto finished() const -> bool { return calculationFinished; }

            // void generateTexture();
            /**
                result_data_可以设置为RayTracingPipeline的静态全局变量
            */
            // void generateTextureViaCudaDataPtr();

            // void setColor();
            // void calculateMaxValue();

            // void setCudaPara(float* data, int width, int height, float max_value);
            void setCudaPara(uchar4* fluxmap_data, int2 resolution);
            void initialTexture();

            void runCuda(bool usecuda = false);

            void cleanup();

        private:
            bool calculationFinished = false;

            // QOpenGLTexture* texture_;
            GLuint texid_;
            uchar4* texture_;      // 需要生成的纹理
            uchar4* fluxmap_data_; // fluxmap的颜色值
            // uchar4* cuPtr_;
            // uchar4* cuPtr_;
            // float* data_;
            int2 resolution_; // 纹理图片的分辨率
            cudaGraphicsResource_t resource_;

            /*
                这里是把colorbar的参数和方法用cuda又写了一遍，或许可以不用这么写-----cuda中的主机设备公用内存
            */
            // colorbar的一些参数
            // CudaColorBar* colorbar_;
            // int3* colors_;
            // float* factors_;
            // int color_num_;
            // float max_value_;
    };
} // namespace solar::cuda

#endif
